import { autoUpdater } from 'electron-updater'
import { ipcMain } from 'electron'

import log from 'electron-log'

const updaterLog = log.scope('[update]')

export default class AppAutoUpdater {
  public window: Electron.BrowserWindow
  constructor(window: Electron.BrowserWindow) {
    this.window = window

    log.transports.file.level = 'debug'
    autoUpdater.logger = updaterLog
    autoUpdater.autoDownload = false

    ipcMain.on('update:now', () => {
      autoUpdater.downloadUpdate()
    })

    autoUpdater.on('error', error => {
      this.sendMessage({ cmd: 'error', message: error })
    })

    // 检查更新
    autoUpdater.on('checking-for-update', () => {
      this.sendMessage({ cmd: 'checking-for-update', message: null })
    })

    // 未发现更新
    autoUpdater.on('update-not-available', message => {
      this.sendMessage({ cmd: 'update-not-available', message })
    })

    // 发现可用更新
    autoUpdater.on('update-available', message => {
      this.sendMessage({ cmd: 'update-available', message })
    })

    // 开始下载更新
    autoUpdater.on('download-progress', message => {
      this.sendMessage({ cmd: 'download-progress', message })
    })

    // 更新已下载完毕
    autoUpdater.on('update-downloaded', async message => {
      this.sendMessage({ cmd: 'update-downloaded', message })
      updaterLog.log('更新已下载完毕', message)
    })

    // 点击检查更新
    ipcMain.on('check:update', () => {
      autoUpdater.checkForUpdatesAndNotify()
      autoUpdater.downloadUpdate()
    })

    // 点击 立即更新
    ipcMain.on('update:now', () => {
      autoUpdater.quitAndInstall()
    })

    // 自动检测更新提示
    this.checkForUpdate()
  }

  public checkForUpdate() {
    autoUpdater.checkForUpdates()
  }

  public sendMessage(data: AutoUpdaterMessage) {
    this.window.webContents.send('onUpdater', data)
  }
}
